<?php

/**
 * 菜品留样
 */
class Sample extends IController
{
    public function lists()
    {
        $page = IReq::get('page') ? IFilter::act(IReq::get('page'), 'int') : 1;
        $sampleObj = new IQuery('sample');
        $sampleObj->where = "deleted_at IS NULL";
        $sampleObj->page = $page;
        $sampleObj->order = "created_at DESC";
        $sampleData = $sampleObj->find();
        JSON::jsonSuccess([
            'sampleObj' => $sampleObj->paging,
            'sampleData' => $sampleData
        ]);
    }

    /**
     * 菜品留样添加
     */
    public function add()
    {
        if (IReq::getMethod() === 'POST') {
            $reqTime = ITime::getDateTime(); //请求时间

            // 准备入库数据（匹配saas_sample字段）
            $params_data = [
                'id' => Common::create_uuid(), // 生成36位UUID
                'category' => IFilter::act(IReq::input('category')), // 分类
                'sample_date' => IFilter::act(IReq::input('sample_date')), // 留样日期
                'meal_time' => IFilter::act(IReq::input('meal_time')), // 餐次
                'dish_name' => IFilter::act(IReq::input('dish_name')), // 菜品名称
                'dish_image' => IFilter::act(IReq::input('dish_image')), // 菜品图片URL
                'remark' => IFilter::act(IReq::input('remark')), // 备注
                'created_at' => $reqTime,
                'updated_at' => $reqTime,
                'deleted_at' => null
            ];
            // 验证必填参数
            $requiredFields = ['category', 'sample_date', 'meal_time', 'dish_name', 'dish_image']; // 根据实际需求调整必填字段
            $validateResult = $this->validateRequiredFields($params_data, $requiredFields);
            if (!$validateResult['status']) {
                JSON::jsonErr(100002, $validateResult['message']);
            }
            // 验证日期格式
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $params_data['sample_date'])) {
                JSON::jsonErr(100002, '留样日期格式错误');
            }
            
            // 验证餐次是否为1-6的整数
            $mealTime = $params_data['meal_time'];
            if (!is_numeric($mealTime) || (int)$mealTime < 1 || (int)$mealTime > 6) {
                JSON::jsonErr(100002, '餐次格式错误，有效值为1-6的整数（1:早餐, 2:间点, 3:午餐, 4:下午茶, 5:晚餐, 6:夜宵）');
            }
            // 验证菜品名称长度
            if (mb_strlen($params_data['dish_name']) > 50) {
                JSON::jsonErr(100002, '菜品名称长度不能超过50个字符');
            }
            // 验证菜品图片URL格式      
            if (!preg_match('/^https?:\/\/(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?:\/[^\s]*)?$/', $params_data['dish_image'])) {
                JSON::jsonErr(100002, '菜品图片URL格式错误');
            }
            // 验证备注长度
            if (mb_strlen($params_data['remark']) > 255) {
                JSON::jsonErr(100002, '备注长度不能超过255个字符');
            }
            // 插入菜品留样数据
            try {
                $sampleObj = new IModel('sample');
                $sampleObj->setData($params_data);
                $sampleObj->add();
                JSON::jsonSuccess();
            } catch (\Exception $e) {
                JSON::jsonErr(100002, '', ['return_code' => $e->getCode(), 'return_msg' => $e->getMessage()]);
            }
        } else {
            JSON::jsonErr(100002, '请求方法错误');
        }
    }

    public function edit()
    {
        if (IReq::getMethod() === 'POST') {
            $reqTime = ITime::getDateTime(); //请求时间

            // 准备入库数据（匹配saas_sample字段）
            $params_data = [
                'id' => IFilter::act(IReq::input('id')), // 主键UUID
                'category' => IFilter::act(IReq::input('category')), // 分类
                'sample_date' => IFilter::act(IReq::input('sample_date')), // 留样日期
                'meal_time' => IFilter::act(IReq::input('meal_time')), // 餐次
                'dish_name' => IFilter::act(IReq::input('dish_name')), // 菜品名称
                'dish_image' => IFilter::act(IReq::input('dish_image')), // 菜品图片URL
                'remark' => IFilter::act(IReq::input('remark')), // 备注
            ];
            // 验证必填参数
            $requiredFields = ['id', 'category', 'sample_date', 'meal_time', 'dish_name', 'dish_image']; // 根据实际需求调整必填字段
            $validateResult = $this->validateRequiredFields($params_data, $requiredFields);
            if (!$validateResult['status']) {
                JSON::jsonErr(100002, $validateResult['message']);
            }
            // 验证日期格式
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $params_data['sample_date'])) {
                JSON::jsonErr(100002, '留样日期格式错误');
            }
            // 验证餐次是否为1-6的整数
            $mealTime = $params_data['meal_time'];
            if (!is_numeric($mealTime) || (int)$mealTime < 1 || (int)$mealTime > 6) {
                JSON::jsonErr(100002, '餐次格式错误，有效值为1-6的整数（1:早餐, 2:间点, 3:午餐, 4:下午茶, 5:晚餐, 6:夜宵）');
            }
            // 验证菜品名称长度
            if (mb_strlen($params_data['dish_name']) > 50) {
                JSON::jsonErr(100002, '菜品名称长度不能超过50个字符');
            }
            // 验证菜品图片URL格式      
            if (!preg_match('/^https?:\/\/(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?:\/[^\s]*)?$/', $params_data['dish_image'])) {
                JSON::jsonErr(100002, '菜品图片URL格式错误');
            }
            // 验证备注长度
            if (mb_strlen($params_data['remark']) > 255) {
                JSON::jsonErr(100002, '备注长度不能超过255个字符');
            }
            // 更新菜品留样数据
            try {
                $sampleObj = new IModel('sample');
                $sampleObj->setData($params_data);
                $sampleObj->update("id='" . $params_data['id'] . "'");
                JSON::jsonSuccess();
            } catch (\Exception $e) {
                JSON::jsonErr(100002, '', ['return_code' => $e->getCode(), 'return_msg' => $e->getMessage()]);
            }
        } else {
            JSON::jsonErr(100002, '请求方法错误');
        }
    }
    public function delete()
    {
        if (IReq::getMethod() === 'POST') {
            $reqTime = ITime::getDateTime(); //请求时间

            // 准备入库数据（匹配saas_sample字段）
            $params_data = [
                'id' => IFilter::act(IReq::input('id')), // 主键UUID
            ];
            // 验证必填参数
            $requiredFields = ['id']; // 根据实际需求调整必填字段
            $validateResult = $this->validateRequiredFields($params_data, $requiredFields);
            if (!$validateResult['status']) {
                JSON::jsonErr(100002, $validateResult['message']);
            }
            // 软删除菜品留样数据
            try {
                $sampleObj = new IModel('sample');
                $sampleObj->setData(['id' => $params_data['id'], 'deleted_at' => $reqTime]);
                $sampleObj->update("id='" . $params_data['id'] . "'");

                JSON::jsonSuccess();
            } catch (\Exception $e) {
                JSON::jsonErr(100002, '', ['return_code' => $e->getCode(), 'return_msg' => $e->getMessage()]);
            }
        }
    }

    /**
     * 验证必填字段是否存在且非空
     * @param array $data 待验证的数据
     * @param array $requiredFields 必填字段列表
     * @return array 验证结果（status:bool, message:string）
     */
    private function validateRequiredFields($data, $requiredFields)
    {
        foreach ($requiredFields as $field) {
            if (!isset($data[$field]) || empty($data[$field])) {
                return ['status' => false, 'message' => "必填字段 {$field} 缺失或为空"];
            }
        }
        return ['status' => true, 'message' => '验证通过'];
    }
}
